package com.kexilo.core.common.security;

import java.util.Set;

/**
 * 用户主体接口
 * 定义登录用户的基本信息，避免模块间的直接依赖
 * 
 * @author Kexilo
 */
public interface UserPrincipal {
    
    /**
     * 获取用户ID
     */
    Long getUserId();
    
    /**
     * 获取用户名
     */
    String getUsername();
    
    /**
     * 获取部门ID
     */
    Long getDeptId();
    
    /**
     * 获取部门名称
     */
    default String getDeptName() {
        return null; // 默认实现，子类可以覆盖
    }
    
    /**
     * 获取租户ID
     */
    default Long getTenantId() {
        return null; // 默认实现，子类可以覆盖
    }
    
    /**
     * 获取用户权限集合
     */
    Set<String> getPermissions();
    
    /**
     * 检查是否拥有指定权限
     * 
     * @param permission 权限标识
     * @return 是否拥有权限
     */
    default boolean hasPermission(String permission) {
        Set<String> permissions = getPermissions();
        return permissions != null && (permissions.contains("*:*:*") || permissions.contains(permission));
    }
    
    /**
     * 检查是否拥有指定权限中的任意一个
     * 
     * @param permissions 权限标识数组
     * @return 是否拥有任意权限
     */
    default boolean hasAnyPermission(String... permissions) {
        if (permissions == null || permissions.length == 0) {
            return false;
        }
        
        for (String permission : permissions) {
            if (hasPermission(permission)) {
                return true;
            }
        }
        
        return false;
    }
    
    /**
     * 检查是否拥有指定的所有权限
     * 
     * @param permissions 权限标识数组
     * @return 是否拥有所有权限
     */
    default boolean hasAllPermissions(String... permissions) {
        if (permissions == null || permissions.length == 0) {
            return true;
        }
        
        for (String permission : permissions) {
            if (!hasPermission(permission)) {
                return false;
            }
        }
        
        return true;
    }
}
